using System;
using System.Linq;
using System.Collections.Generic;

using PMServiceDesk.DataType;
using PMServiceDesk.DataAccess;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.BusinessLogic
{
    public class InteresadoPaqueteTrabajoLogic
    {
        #region Variables

        private InteresadoPaqueteTrabajoData _interesadoPaqueteTrabajoData;

        #endregion

        #region Constructores

        public InteresadoPaqueteTrabajoLogic()
        {
            _interesadoPaqueteTrabajoData = new InteresadoPaqueteTrabajoData();
        }

        #endregion

        #region Metodos

        public InteresadoPaqueteTrabajoType CargarPorId(string id)
        {
            _interesadoPaqueteTrabajoData.FiltrarPorId(id);

            return _interesadoPaqueteTrabajoData.Cargar();
        }

        public InteresadoPaqueteTrabajoType CargarPorPaqueteTrabajoUsuario(string paqueteTrabajoId,string usuarioId)
        {
            _interesadoPaqueteTrabajoData.FiltrarPorPaqueteTrabajoId(paqueteTrabajoId);
            _interesadoPaqueteTrabajoData.FiltrarPorUsuarioInteresadoId(usuarioId);

            return _interesadoPaqueteTrabajoData.Cargar();
        }

        public void Grabar(InteresadoPaqueteTrabajoType interesadoPaqueteTrabajo)
        {
            _interesadoPaqueteTrabajoData.Grabar(interesadoPaqueteTrabajo);
        }

        public void GrabarInteresadosImportarLineaBase(string usuarioRegistroId,LineaBaseDetalleType lineBaseDetalle, List<KeyValuePair<string, string>> jefesProyecto, List<RecursoImportarType> recursos)
        {
            List<string> interesados = new List<string>();

            interesados.Add(usuarioRegistroId);
            interesados.Add(lineBaseDetalle.UsuarioResponsableId);

            foreach (KeyValuePair<string, string> jefeProyecto in jefesProyecto)
                interesados.Add(jefeProyecto.Key);

            foreach (RecursoImportarType recurso in recursos)
                if(recurso.UsuarioId != null)
                    interesados.Add(recurso.UsuarioId);

            interesados = interesados.Distinct().ToList();

            foreach (string interesado in interesados)
                this.GrabarInteresadosLineaBase
                (
                    new InteresadoPaqueteTrabajoType
                    {
                        PaqueteTrabajoId = lineBaseDetalle.PaqueteTrabajoId,
                        UsuarioInteresadoId = interesado,
                        UsuarioRegistroId = usuarioRegistroId
                    }
                );
        }

        public void GrabarInteresadosLineaBase(InteresadoPaqueteTrabajoType interesadoPaqueteTrabajo)
        {
            if (this.CargarPorPaqueteTrabajoUsuario(interesadoPaqueteTrabajo.PaqueteTrabajoId, interesadoPaqueteTrabajo.UsuarioInteresadoId) != null) return;

            interesadoPaqueteTrabajo.FechaRegistro = DateTime.Now;

            _interesadoPaqueteTrabajoData.Grabar(interesadoPaqueteTrabajo);
        }

        public InteresadoPaqueteTrabajoType CargarPorPaqueteTrabajo(string paqueteTrabajoId, string recursoId)
        {
            _interesadoPaqueteTrabajoData.FiltrarPorPaqueteTrabajoId(paqueteTrabajoId);

            return _interesadoPaqueteTrabajoData.Cargar();
        }

        public List<InteresadoPaqueteTrabajoType> CargarExplorador(string id,string paqueteTrabajoId,string usuarioInteresadoId)
        {
            if(id != "") _interesadoPaqueteTrabajoData.FiltrarPorId(id);
            if(paqueteTrabajoId != "") _interesadoPaqueteTrabajoData.FiltrarPorPaqueteTrabajoId(paqueteTrabajoId);
            if(usuarioInteresadoId != "") _interesadoPaqueteTrabajoData.FiltrarPorUsuarioInteresadoId(usuarioInteresadoId);

            return _interesadoPaqueteTrabajoData.CargarListaVista();
        }

        public List<InteresadoPaqueteTrabajoType> CargarExploradorPaginado(InteresadoPaqueteTrabajoType  registroBusqueda, int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _interesadoPaqueteTrabajoData.FiltrarPorPaqueteTrabajoId(registroBusqueda.PaqueteTrabajoId);

            if (registroBusqueda.UsuarioInteresado != "") _interesadoPaqueteTrabajoData.FiltrarPorUsuarioInteresado(registroBusqueda.UsuarioInteresado);
            if (registroBusqueda.UsuarioRegistro != "") _interesadoPaqueteTrabajoData.FiltrarPorUsuarioRegistro(registroBusqueda.UsuarioRegistro);
            if (registroBusqueda.FechaRegistro_Format != "") _interesadoPaqueteTrabajoData.FiltrarPorFechaRegistroExacta(ConvertFormat.Char_To_Date(registroBusqueda.FechaRegistro_Format));

            return _interesadoPaqueteTrabajoData.CargarListaVista(paginaActual, cantidadMostrar, orderBy);
        }

        #endregion
    }
}
